package com.java214.elec.service.impl;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.java214.elec.dao.entityDao.IElecSystemDDLDao;
import com.java214.elec.dao.entityDao.IElecUserDao;
import com.java214.elec.entity.ElecUser;
import com.java214.elec.service.IElecUserService;
import com.java214.elec.utils.MD5keyBean;



@Service(IElecUserService.SERVICE_NAME)
@Transactional(readOnly=true)
public class ElecUserServiceImpl implements IElecUserService {

	//注入用户dao层
	@Resource(name=IElecUserDao.SERVICE_NAME)
	private IElecUserDao elecUserDao;
	//注入运行监控dao层
	@Resource(name=IElecSystemDDLDao.SERVICE_NAME)
	private IElecSystemDDLDao elecSystemDDLDao;

	
	
	/**  
	* @Name: findUserListByCondition
	* @Description: 指定条件查询用户信息
	* @Author: 滕一帆（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2019-11-15（创建日期）
	* @Parameters: ElecUser：传递参数
	* @Return: List<ElecUser>：用户集合
	*/
	@Override
	public List<ElecUser> findUserListByCondition(ElecUser elecUser) {
		/**
		 * 2：获取页面传递的姓名、所属单位、入职时间判断输入的值是否为空
			  * 如果为null，查询所有
			  * 如果不为null，就指定对应的条件查询用户表
			  * 返回List<ElecUser>
		 */
		//组织查询条件
		String condition = "";
		List<Object> paramsList = new ArrayList<Object>();
		//获取用户姓名
		String userName = elecUser.getUserName();
		if(StringUtils.isNotBlank(userName)){
			condition += " and o.userName like ?";
			paramsList.add("%"+userName+"%");
		}
		//所属单位
		if(StringUtils.isNotBlank(elecUser.getJctID())){
			condition += " and o.jctID = ?";
			paramsList.add(elecUser.getJctID());
		}
		//入职日期开始时间
		if(elecUser.getOnDutyDateBegin()!=null){
			condition += " and o.onDutyDate >= ?";
			paramsList.add(elecUser.getOnDutyDateBegin());
		}
		//入职日期结束时间
		if(elecUser.getOnDutyDateEnd()!=null){
			condition += " and o.onDutyDate <= ?";
			paramsList.add(elecUser.getOnDutyDateEnd());
		}
		Object [] params = paramsList.toArray();
		//排序，按照入职时间的降序排列
		Map<String, String> orderby = new LinkedHashMap<String, String>();
		orderby.put("o.onDutyDate", "desc");
		
		List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition, params, orderby);
		/**添加分页2019-11-15 begin*/
	/*	PageInfo pageInfo = new PageInfo(ServletActionContext.getRequest());
		List<ElecUser> list = elecUserDao.findCollectionByConditionWithPage(condition, params, orderby,pageInfo);
		ServletActionContext.getRequest().setAttribute("page",pageInfo.getPageBean() );*/
		/**添加分页2013-11-30 end*/
		/**3：涉及到数据字段字段的时候，要将数据项的编号转换成数据项值*/
		this.userPOListToVOList(list);
		return list;
	}

	/**涉及到数据字段字段的时候，要将数据项的编号转换成数据项值*/
	private void userPOListToVOList(List<ElecUser> list) {
		if(list!=null && list.size()>0){
			for(ElecUser elecUser:list){
				//使用数据类型和数据项的编号获取数据项的值
				//性别
				elecUser.setSexID(StringUtils.isNotBlank(elecUser.getSexID())?elecSystemDDLDao.findDdlNameByKeywordAndDdlCode("性别",elecUser.getSexID()):"");
				//所属单位
				elecUser.setJctID(StringUtils.isNotBlank(elecUser.getJctID())?elecSystemDDLDao.findDdlNameByKeywordAndDdlCode("所属单位",elecUser.getJctID()):"");
				//是否在职
				elecUser.setIsDuty(StringUtils.isNotBlank(elecUser.getIsDuty())?elecSystemDDLDao.findDdlNameByKeywordAndDdlCode("是否在职",elecUser.getIsDuty()):"");
				//职位
				elecUser.setPostID(StringUtils.isNotBlank(elecUser.getPostID())?elecSystemDDLDao.findDdlNameByKeywordAndDdlCode("职位",elecUser.getPostID()):"");
				//#数据字典项要定义成VARCHAR，可以用于数据字典的ddlCode和ddlName之间的转换
			}
		}
	}
	
	/**  
	* @Name: checkUser
	* @Description: 使用登录名作为条件，查询登录名在数据库中是否出现重复
	* @Author: 滕一帆（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2019-11-15（创建日期）
	* @Parameters: 无
	* @Return: String message = "";
	*        message=1:表示登录名不能为空
	*        message=2:表示登录名在数据库中已经存在，此时不能保存
	*        message=3:表示登录名在数据库表不存在，此时可以保存
	*/
	@Override
	public String checkUser(String logonName) {
		String message = "";
		if(StringUtils.isNotBlank(logonName)){
			String condition = " and o.logonName = ?";
			Object [] params = {logonName};
			/**
			 * 2：以登录名作为条件，查询用户表，返回List<ElecUser>
			 *   如果登录名为空，返回message=1
				  如果list不为空，说明数据库中已经存在值，返回message=2
				  如果list为空，说明数据库中没有值，返回message=3
			 */
			List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition, params, null);
			if(list!=null && list.size()>0){
				message = "2";
			}
			else{
				message = "3";
			}
		}
		else{
			message = "1";
		}
		return message;
	}

	/**  
	* @Name: saveUser
	* @Description: 保存用户
	* @Author: 滕一帆（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2013-11-19（创建日期）
	* @Parameters: ElecUser：存放保存对象
	* @Return: 无
	*/
	@Override
	@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
	public void saveUser(ElecUser elecUser) {
		// TODO Auto-generated method stub
		//获取用户ID
				String userID = elecUser.getUserID();
				//添加md5的密码加密
				this.md5Password(elecUser);
				//1：如果userID==null，直接获取保存的PO对象，执行save()
				if(StringUtils.isBlank(userID)){
					elecUserDao.save(elecUser);
				}
				//2：如果userID!=null，获取更新的PO对象，执行update()
				else{
					elecUserDao.update(elecUser);
				}

	}

	/**添加md5的密码加密，对登录名的密码进行安全的控制*/
	private void md5Password(ElecUser elecUser) {
		//获取页面输入的密码
		String logonPwd = elecUser.getLogonPwd();
		//加密后的密码
		String md5LogonPwd = "";
		//如果密码没有填写，给出初始密码123
		if(StringUtils.isBlank(logonPwd)){
			logonPwd = "123";
		}
		//判断是否对密码进行了修改，获取password
		String password = elecUser.getPassword();
		//表示没有修改密码，此时不需要进行加密
		if(password!=null && password.equals(logonPwd)){
			md5LogonPwd = logonPwd;
		}
		else{
			//md5密码加密
			MD5keyBean md5keyBean = new MD5keyBean();
			md5LogonPwd = md5keyBean.getkeyBeanofStr(logonPwd);
		}
		//最后讲加密后的密码放置到ElecUser中
		elecUser.setLogonPwd(md5LogonPwd);
	}
	
	/**  
	* @Name: findElecUserByID
	* @Description: 使用主键ID，查询对应的用户信息
	* @Author: 滕一帆（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2019-11-15（创建日期）
	* @Parameters: ElecUser：存放ID
	* @Return: ElecUser：查询用户信息
	*/
	@Override
	public ElecUser findElecUserByID(ElecUser elecUser) {
		//获取用户ID
				String userID = elecUser.getUserID();
				ElecUser user = elecUserDao.findObjectById(userID);
				return user;
	}

	/**  
	* @Name: deleteUserByIds
	* @Description: 页面选择用户ID执行删除（1和或者多个）
	* @Author: 滕一帆（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2019-11-15（创建日期）
	* @Parameters: ElecUser：存放ID的字符串，如果多个值，中间使用”, “
	* @Return: 无
	*/
	@Override
	@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
	public void deleteUserByIds(ElecUser elecUser) {
		// TODO Auto-generated method stub
		//获取ID
				String userID = elecUser.getUserID();
				String [] ids = userID.split(", ");
				elecUserDao.deleteBojectByIDs(ids);

	}

}
